﻿using System;

namespace Bettzueche.RLGlue.TaskSpec {
    /// Use the <see cref="TaskSpecFactory"/>  to create an instance
    /// </summary>
    /// <remarks></remarks>
    public interface ITaskSpec {
        /// <summary>
        /// Returns the string representation of the Task Spec object.
        /// </summary>
        /// <remarks>
        /// This string representation follows the Task Spec language as outlined
        /// <a href="http://glue.rl-community.org/wiki/Task_Spec">glue.rl-community.org/wiki/Task_Spec</a>.
        /// </remarks>
        String Version { get; }

        /// <summary>
        /// Gets the propblemtype. (episodic | continuous | something else)
        /// </summary>
        String Propblemtype { get; }

        /// <summary>
        /// Gets the discountfactor.
        /// </summary>
        double Discountfactor { get; }

        /// <summary>
        /// Gets the observation ranges.
        /// </summary>
        RLTypesSpec Observations { get; }

        /// <summary>
        /// Gets the action ranges.
        /// </summary>
        RLTypesSpec Actions { get; }

        /// <summary>
        /// Gets the reward range.
        /// </summary>
        DoubleRange Reward { get; }

        /// <summary>
        /// Gets or sets the extra.
        /// </summary>
        /// <value>
        /// The extra.
        /// </value>
        String Extra { get; set; }

        /// <summary>
        /// Gets the task spec string.
        /// </summary>
        /// <returns></returns>
        String ToTaskSpecString();
    }
}
